package com.isyscore.entity.shrio;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.isyscore.entity.admin.SysUser;
import com.isyscore.exception.FjMesException;
import com.isyscore.mapper.admin.SysUserMapper;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import java.awt.*;
import java.util.List;

/**
 * CustomRealm
 *
 * @author gavinluo7@foxmail.com
 */
public class CustomRealm extends AuthorizingRealm {
    @Autowired
    private SysUserMapper userMapper;
    /**
     * 重写获取授权信息的方法
     * 此方法旨在根据用户主体获取相应的授权信息，以确定主体（如用户）的权限
     * 目前，该方法尚未实现任何逻辑，返回null表示没有授权信息可用
     *
     * @param principals 用户主体的集合，用于识别用户
     * @return AuthorizationInfo 授权信息对象，包含角色和权限信息当前为null
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 获取用户ID，作为获取权限信息的依据
        Long userId = (Long) principals.getPrimaryPrincipal();
        // 通过用户ID查询该用户的所有权限
        List<String> permissions = userMapper.findPermissionsByUserId(userId);
        if(permissions.isEmpty()){
            throw new RuntimeException("该用户没有任何权限");
        }
        // 创建一个简单的授权信息对象，并将查询到的权限添加进去
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addStringPermissions(permissions);
        return info;
    }
    /**
     * 重写获取认证信息的方法
     * 此方法用于验证用户提供的认证信息（如用户名和密码），并返回认证信息对象
     * 如果认证失败，将抛出AuthenticationException异常
     *
     * @param token 包含用户提交的认证信息（如用户名和密码）的令牌
     * @return AuthenticationInfo 认证信息对象，包含用户的身份信息
     * @throws AuthenticationException 如果认证过程中发生错误或认证失败
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String loginName = (String) token.getPrincipal();
        SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getLoginName, loginName));
        return new SimpleAuthenticationInfo(sysUser.getUserId(), sysUser.getPassword(), getName());
    }
}
